[Linux-Kernel][新增System Call]

Linux-Kernel 新增System Call

我的環境是 OS:Ubuntu 14.04 LTS(32bits-i386) CPU:i7-2600
Linux版本為linux-3.10.60

  1. 到Linux Kernel Archives 下載Source Code到Desktop Link ,我是下載3.10.60.tar.xz版本
  2. 解壓linux-3.10.60.tar.xz
    1
    xz -d linux-3.10.60.tar.xz
  3. 解壓linux-3.10.60.tar
    1
    tar xvf linux-3.10.60.tar
  4. 到~/Desktop/linux-3.10.60/arch/x86/kernel建立helloworld.c的程式,其就是我們的System Call
    ~/Desktop/linux-3.10.60/arch/x86/kernel
    1
    2
    3
    4
    5
    6
    7
    8
    #include <linux/linkage.h>
    #include <linux/kernel.h>
    asmlinkage int sys_helloworld(void)
    {
    printk(KERN_EMERG "Hello World");
    return 1;
    }
  5. 到~/Desktop/linux-3.10.60/include/linux/syscalls.h中增加
    ~/Desktop/linux-3.10.60/include/linux/syscalls.h
    1
    asmlinkage int sys_helloworld(void);
  6. 到~/Desktop/linux-3.10.60/arch/x86/syscalls/syscall_32.tbl中增加
    ~/Desktop/linux-3.10.60/arch/x86/syscalls/syscall_32.tbl
    1
    351 i386 helloworld sys_helloworld

    注意Entry不一定是351,要隨下載的Kernel Source Code作調整
  7. 到~/Desktop/linux-3.10.60/arch/x86/kernel/Makefile中增加
    ~/Desktop/linux-3.10.60/arch/x86/kernel/Makefile
    1
    obj-y+= helloworld.o

    這樣新增System Call就告一段落,再來是編譯Kernel
  8. 安裝編譯會用到的套件
    1
    sudo apt-get install fakeroot build-essential kernel-package libncurses5 libncurses5-dev
  9. 把現在系統的config複製出來到改過的Kernel中
    1
    2
    3
    cd ~/Desktop/linux-3.10.60
    cp /boot/config-linux-3.10.60 ./.config
    make menuconifg
  10. 到menuconifg畫面時,選擇Save改名為.config就好,之後按Exit離開
  11. Compile Kernel
    1
    2
    make-kpkg clean
    fakeroot make-kpkg --initrd kernel_image kernel_headers

    Compile Kernel會花相當多時間,要有耐心等待,在fakeroot make-kpkg —initrd kernel_image kernel_headers後方加入 -j [邏輯核心數],用多核心去跑會比較快
  12. 經過漫長的等待,會輸出兩個檔案linux-image-3.10.60.Custom_i386.deb和linux-headers-3.10.60.Custom_i386.deb,安裝他們
    1
    2
    sudo dpkg -i linux-image-3.10.60.Custom_i386.deb
    sudo dpkg -i linux-headers-3.10.60.Custom_i386.deb
  13. 接下來重開機
  14. 輸入uname -r 可以檢查是否更新Kernel
    安裝完kernel一定要重開機,否則不會更新版本
  15. 寫一個call System Call的小程式
    test.c
    1
    2
    3
    4
    5
    6
    7
    8
    #include <syscall.h>
    #include <sys/types.h>
    int main(void)
    {
    int a=syscall(351);
    return 0;
    }
  16. 測試和編譯
    1
    2
    gcc -o test test.c
    ./test

    在terminal上不會跑出結果出來,要輸入dmesg,結果才會跑出來